package org.pz.camunda.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.camunda.bpm.engine.task.Task;
import java.util.Date;

/**
 * Camunda 任务 DTO（仅暴露必要字段）
 */
public class CamundaTaskDto {

    private String id;              // 任务ID
    private String name;            // 任务名称
    private String assignee;        // 处理人
    private String description;     // 任务描述

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime;       // 创建时间

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date dueDate;           // 截止时间

    private String processInstanceId;  // 所属流程实例ID
    private String processDefinitionId;// 流程定义ID

    private String formKey;

    // 通过 Task 接口构造 DTO（不依赖具体实现类）
    public CamundaTaskDto(Task task) {
        this.id = task.getId();
        this.name = task.getName();
        this.assignee = task.getAssignee();
        this.description = task.getDescription();
        this.createdTime = task.getCreateTime();
        this.dueDate = task.getDueDate();
        this.processInstanceId = task.getProcessInstanceId();
        this.processDefinitionId = task.getProcessDefinitionId();
        this.formKey = task.getFormKey();

        // 注意：以下字段不要直接访问，通过 Camunda API 获取
        // 错误示例：task.getExecution().getId() （可能触发 NPE）
    }

    // ---------------------------
    // Getter 方法（不要生成 Setter！）
    // ---------------------------
    public String getId() { return id; }
    public String getName() { return name; }
    public String getAssignee() { return assignee; }
    public String getDescription() { return description; }
    public Date getCreatedTime() { return createdTime; }
    public Date getDueDate() { return dueDate; }
    public String getProcessInstanceId() { return processInstanceId; }
    public String getProcessDefinitionId() { return processDefinitionId; }
    public String getFormKey() { return formKey; }

    // ---------------------------
    // 可选：添加实用方法
    // ---------------------------

    /**
     * 判断任务是否已分配
     */
    public boolean isAssigned() {
        return assignee != null && !assignee.isEmpty();
    }

    /**
     * 判断任务是否已逾期
     */
    public boolean isOverdue() {
        return dueDate != null && new Date().after(dueDate);
    }
}
